package com.atguigu.ssyx.common.config;

/**
 * @author 杨林
 * @create 2023-08-04 10:31 星期五
 * description:
 */

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import sun.rmi.runtime.Log;

import javax.annotation.PostConstruct;

/**
 * 消息的确认配置
 */
@Component
@Slf4j
public class MQProducerAckConfig implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback {

    //如果发送消息使用的是 private RabbitTemplate rabbitTemplate; 对象
    //如果不手动配置的话，当前的rabbitTemplate与当前的配置没有任何关系
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    
    //设置 表示修饰一个非静态的void方法，在服务器加载servlet的时候运行，并且只执行一次
    @PostConstruct
    public void init(){
        rabbitTemplate.setReturnCallback(this);
        rabbitTemplate.setConfirmCallback(this);
    }
    
    /**
     * 表示消息是否正确发送的交换机上 （消息发送给交换机以后的回调函数）
     * @param correlationData：消息的载体
     * @param ack：判断是否发送到交换机上
     * @param cause：原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack){
            log.info("消息发送成功");
        }else {
            log.info("消息发送失败，失败原因：{}",cause);
        }
    }


    /**
     * 消息如果没有正确发送到队列中，则会回调这个方法！如果消息被正常处理，则不会回调这个方法
     * @param message：消息主体
     * @param replyCode：应答码
     * @param replyText：应答消息
     * @param exchange：消息使用的交换机
     * @param routingKey：消息使用的路由key
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.info("消息主体：{}",new String(message.getBody()));
        log.info("应答码：{}",replyCode);
        log.info("应答消息：{}",replyText);
        log.info("消息使用的交换机：{}",exchange);
        log.info("消息使用的路由key：{}",routingKey);
    }
}
